/*-------------------------------------------------------------------------
 *
 * statistics.h
 *	  扩展统计信息和选择性估计函数。
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/statistics/statistics.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef STATISTICS_H
#define STATISTICS_H

#include "commands/vacuum.h"
#include "nodes/pathnodes.h"

#define STATS_MAX_DIMENSIONS	8	/* 属性的最大数量 */

/* 多变量不同系数 */
#define STATS_NDISTINCT_MAGIC		0xA352BFA4	/* 结构标识符 */
#define STATS_NDISTINCT_TYPE_BASIC	1	/* 结构版本 */

/* MVNDistinctItem 表示列的单一组合 */
typedef struct MVNDistinctItem
{
	double		ndistinct;		/* 此组合的 ndistinct 值 */
	int			nattributes;	/* 属性的数量 */  
	AttrNumber *attributes;		/* 属性编号 */
} MVNDistinctItem;

/* 一个 MVNDistinct 对象，包含所有可能的列组合 */
typedef struct MVNDistinct
{
	uint32		magic;			/* 魔术常量标记 */
	uint32		type;			/* ndistinct 的类型 (BASIC) */
	uint32		nitems;			/* 统计中的项目数量 */
	MVNDistinctItem items[FLEXIBLE_ARRAY_MEMBER];
} MVNDistinct;

/* 多变量函数依赖 */
#define STATS_DEPS_MAGIC		0xB4549A2C	/* 标记序列化的 bytea */
#define STATS_DEPS_TYPE_BASIC	1	/* 基础依赖类型 */

/*
 * 函数依赖，跟踪列级关系（一个列中的值决定另一个列中的值）。
 */
typedef struct MVDependency
{
	double		degree;			/* 有效性程度 (0-1) */
	AttrNumber	nattributes;	/* 属性的数量 */  
	AttrNumber	attributes[FLEXIBLE_ARRAY_MEMBER];	/* 属性编号 */
} MVDependency;

typedef struct MVDependencies
{
	uint32		magic;			/* 魔术常量标记 */
	uint32		type;			/* MV 依赖的类型 (BASIC) */
	uint32		ndeps;			/* 依赖项的数量 */
	MVDependency *deps[FLEXIBLE_ARRAY_MEMBER];	/* 依赖关系 */
} MVDependencies;

/* 用于标记序列化为 bytea 的统计信息 */
#define STATS_MCV_MAGIC			0xE1A651C2	/* 标记序列化的 bytea */
#define STATS_MCV_TYPE_BASIC	1	/* 基本 MCV 列表类型 */

/* MCV 列表中的最大项目数（应该等于 max default_statistics_target） */
#define STATS_MCVLIST_MAX_ITEMS        10000

/*
 * 多变量 MCV （最常见值）列表
 *
 * MCV 项目的直接扩展 - 即属性值的组合列表（数组），
 * 以及频率和 NULL 标志。
 */
typedef struct MCVItem
{
	double		frequency;		/* 此组合的频率 */
	double		base_frequency; /* 如果独立，则频率 */
	bool	   *isnull;			/* NULL 标志 */
	Datum	   *values;			/* 项目值 */
} MCVItem;

/* 多变量 MCV 列表 - 本质上是 MCV 项目的数组 */
typedef struct MCVList
{
	uint32		magic;			/* 魔术常量标记 */
	uint32		type;			/* MCV列表类型（基础） */
	uint32		nitems;			/* 数组中MCV项的数量 */
	AttrNumber	ndimensions;	/* 维度数量 */
	Oid			types[STATS_MAX_DIMENSIONS];	/* 数据类型的OID */
	MCVItem		items[FLEXIBLE_ARRAY_MEMBER];	/* MCV 项目的数组 */
} MCVList;

extern MVNDistinct *statext_ndistinct_load(Oid mvoid, bool inh);
extern MVDependencies *statext_dependencies_load(Oid mvoid, bool inh);
extern MCVList *statext_mcv_load(Oid mvoid, bool inh);

extern void BuildRelationExtStatistics(Relation onerel, bool inh, double totalrows,
									   int numrows, HeapTuple *rows,
									   int natts, VacAttrStats **vacattrstats);
extern int	ComputeExtStatisticsRows(Relation onerel,
									 int natts, VacAttrStats **stats);
extern bool statext_is_kind_built(HeapTuple htup, char kind);
extern Selectivity dependencies_clauselist_selectivity(PlannerInfo *root,
													   List *clauses,
													   int varRelid,
													   JoinType jointype,
													   SpecialJoinInfo *sjinfo,
													   RelOptInfo *rel,
													   Bitmapset **estimatedclauses);
extern Selectivity statext_clauselist_selectivity(PlannerInfo *root,
												  List *clauses,
												  int varRelid,
												  JoinType jointype,
												  SpecialJoinInfo *sjinfo,
												  RelOptInfo *rel,
												  Bitmapset **estimatedclauses,
												  bool is_or);
extern bool has_stats_of_kind(List *stats, char requiredkind);
extern StatisticExtInfo *choose_best_statistics(List *stats, char requiredkind,
												bool inh,
												Bitmapset **clause_attnums,
												List **clause_exprs,
												int nclauses);
extern HeapTuple statext_expressions_load(Oid stxoid, bool inh, int idx);

#endif							/* STATISTICS_H */
